#!/bin/bash

# Definicao de rotas para redundancia Oi-Cinte para trt21
# Matheus - 22/09/2014

# o script sempre testa o ping pelo caminho primario. Se estiver ok, testar se
# ja usa o caminho. senao, testa se esta no secundario

#####################################
## Nao alterar depois deste ponto  ##
## Alterar o conf da respectiva VT ##
#####################################

# Carregando os dados de configuracao, recebendo via linha de comando
# Teremos um unico script no home, cada config no seu dir
#
# Arvore de dir
# 
# rotas/
# rotas/assu
# rotas/caico


function define_rota_cinte () {

  if [ $AMBIENTE = "TRT" ]; then
    # ambiente TRT
    # deleta a rota atual para a vt
    $ROUTE delete -net $REDE_VT netmask $NETMASK
  
    # define a nova rota usando a cinte
    $ROUTE add -net $REDE_VT netmask $NETMASK gw $GW_CINTE
  else
    # ambiente VT
    # deleta a rota atual para a vt
    $ROUTE delete default
  
    # define a nova rota usando a cinte
    $ROUTE add default gw $GW_CINTE
  fi

  # registra a rota
  echo "cinte" > $CONF/$VT.rota
  manda_mail
}

function define_rota_oi () {

  if [ $AMBIENTE = "TRT" ]; then
    # ambiente TRT
    # deleta a rota atual para a vt
    $ROUTE delete -net $REDE_VT netmask $NETMASK
  
    # define a nova rota usando a oi
    $ROUTE add -net $REDE_VT netmask $NETMASK gw $GW_OI
  else
    # ambiente VT
    # deleta a rota atual para a vt
    $ROUTE delete default
  
    # define a nova rota usando a oi
    $ROUTE add default gw $GW_OI
  fi

    # registra a rota
  echo "oi" > $CONF/$VT.rota
  manda_mail
}

function manda_mail () {

  SAIDA=/tmp/mail.body.$VT
  
  # manda email
  echo "To: redes@trt21.jus.br" > $SAIDA
  echo "Subject: JTR Info - $VT" >> $SAIDA
  echo "Thread-Topic: <JTR Info - $VT>" >> $SAIDA
#  echo "Thread-Index: <$VT>" >> $SAIDA
#  echo "Message-ID: <$VT>" >> $SAIDA
  echo "" >> $SAIDA
  echo "=> Maquina: `hostname`" >> $SAIDA
  echo "=> VT: $VT" >> $SAIDA
  echo "=> Hora: `date '+%Y-%m-%d %H:%M:%S'`" >> $SAIDA
  echo -n "=> Migrou para a " >> $SAIDA
  cat $CONF/$VT.rota >> $SAIDA

# Dando erro - Matheus 10/12/2014
#  /root/bin/script_mail.sh $SERVIDOR_MAIL srv-correio-natal-a.trt21.jus.br matheus@trt21.jus.br redes@trt21.jus.br > /dev/null

#  cat $SAIDA | /bin/mail -s "JTR Informe - $VT" redes@trt21.jus.br
  # enviando com sendmail
  /usr/sbin/sendmail.postfix redes@trt21.jus.br < $SAIDA
}

function registra_log () {
 # em cada teste escrever o que ocorreu, ping ok ou nao
 LOG=/root/rotas/$VT/$VT-`/bin/date +%Y-%m-%d`.log

 echo "`date '+%a %H:%M:%S'` $1 `cat $CONF/$VT.rota`" >> $LOG
}

# main()

# Receber qual a VT
VT=$1

if [ "$#" -ne 1 ]; then
  echo "Usage: $0 Nome_VT" >&2
  exit 1
elif [ ! -e /root/rotas/$VT/script_rotas.conf ]; then
  echo "Arquivo da VT inexistente, ou nome de VT invalido" >&2
  exit 1
fi

# as duas vars podem assumir dois valores: oi/cinte
ROTA_ATUAL=""
ROTA_TESTADA=""
ROTA_PREF="cinte"

COUNT_CAIU=0
COUNT_VOLTOU=0

MAX_COUNT_CAIU=4
MAX_COUNT_VOLTOU=10

PING=/bin/ping
ROUTE=/sbin/route

CONF=/root/rotas/$VT

SERVIDOR_MAIL="192.168.200.6"

#. /root/rotas/$VT/script_rotas.conf
. $CONF/script_rotas.conf

# testa existir o diretorio

if [ ! -d $CONF ]; then
  mkdir -p $CONF
fi

$PING -c 1 -s 1000 $IP_DEST > /dev/null

RESULTADO=$?

if [ $RESULTADO = "0" ]; then

  registra_log OK

  # Rota principal ok
  ROTA_TESTADA="cinte"

  # existe o arquivo com a rota ?
  if [ -e $CONF/$VT.rota ]; then
    # tem o arquivo
    ROTA_ATUAL=`cat $CONF/$VT.rota`
  else
    # nao tem nada definido
    # colocar a rota padrao e escrever o arquivo
    # sair
    define_rota_cinte

    exit 0;
  fi

  # testar se estamos na rota testada
  if [ $ROTA_ATUAL = $ROTA_TESTADA ]; then
    # a rota atual eh a rota padrao (cinte)
    # faz nada, tudo ok
    touch /dev/null
    # reforca a contagem para zero
    echo 0 > $CONF/$VT.queda

    exit 0;
  else
    # a rota atual nao eh a rota testada
    # estamos na rota de backup
    # precisamos saber se ja passou o tempo de espera
    # pra voltar a rota preferida
    if [ -e $CONF/$VT.volta ]; then
      # tem o arquivo
      COUNT_VOLTOU=`cat $CONF/$VT.volta`

      if [ -z $COUNT_VOLTOU ]; then
        echo 0 > $CONF/$VT.volta
    # aqui vai pra ZERO
    #    COUNT_VOLTOU=$MAX_COUNT_CAIU
        COUNT_VOLTOU=0
      fi
    else
      # Invertendo a logica, para os dois contadores ficarem 
      #  com processamento iguais
      echo 0 > $CONF/$VT.volta
      COUNT_VOLTOU=0
    fi

    if [ $COUNT_VOLTOU -eq $MAX_COUNT_VOLTOU ]; then
      # alterar rota
      define_rota_cinte
    else
      # incrementar contador
      expr $COUNT_VOLTOU + 1 > $CONF/$VT.volta
    fi
  fi

else

  registra_log Falha

  # Rota secundaria
  ROTA_TESTADA="oi"
  # existe o arquivo com a rota ?
  if [ -e $CONF/$VT.rota ]; then
    # tem o arquivo
    ROTA_ATUAL=`cat $CONF/$VT.rota`
  else
    # nao tem nada definido
    # colocar a rota padrao e escrever o arquivo
    # sair
    define_rota_oi

    # iniciar contador de retorno de rota preferencial
    echo 0 > $CONF/$VT.volta

    exit 0;
  fi

  # testar se estamos na rota testada
  if [ $ROTA_ATUAL = $ROTA_TESTADA ]; then
    # a rota atual eh a rota secundaria
    # faz nada, tudo ok
    touch /dev/null
    # reforcar o contador de retorno da cinte
    echo 0 > $CONF/$VT.volta

    # tem exit ?!
    exit 0;
  else
    # caiu ?!
    if [ -f $CONF/$VT.queda ]; then
      COUNT_CAIU=`cat $CONF/$VT.queda`
    else
      echo 1 > $CONF/$VT.queda
      COUNT_CAIU=1
      exit 0;
    fi

    if [ $COUNT_CAIU -eq $MAX_COUNT_CAIU ]; then
      # caiu. precisa mudar
      define_rota_oi
      echo 0 > $CONF/$VT.volta
      echo 0 > $CONF/$VT.queda
    else
      expr $COUNT_CAIU + 1 > $CONF/$VT.queda
    fi
  fi
fi
